package cn.neusoft.jdkproxy;

import cn.neusoft.staticproxy.EmpService;
import cn.neusoft.staticproxy.EmpServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 静态代理和jdk动态代理
 * 1.目标类必须要实现接口
 * 2.目标类和代理类必须 要实现同一个接口，实现接口中的方法
 * 3.核心业务是由目标类对象来实现的，重复代码(事务处理)是由代理类来完成的
 */

/**
 * 1.静态代理和动态代理都需要先创建一个目标类的对象
 * 2.动态代理的第一个参数是获取类的加载器
 * 3.第二个参数是获取这个目标类实现了那些接口
 * 4.第四个参数就是一个匿名内部类，类中就是要写代理那些任务
 *
 */
public class ProxyTest {
	public static void main(String[] args) {
		EmpService target=new EmpServiceImpl();
		EmpService proxy=(EmpService) Proxy.newProxyInstance(
				target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("开启事务");
						try {
							Object result = method.invoke(target, args);
							System.out.println("提交事务");
							return result;
						} catch (Exception e) {
							System.out.println("回滚事务");
						} finally {
							System.out.println("关闭事务");
						}
						return null;
					}
				}
		);
		proxy.add();
		System.out.println("---------");
		proxy.update();
	}
}